import { HttpException, HttpStatus } from '@nestjs/common';
import { RESPONSE_CODE, RESPONSE_MESSAGE, type ResponseCode } from '@nbase/shared';

/**
 * 业务异常基类
 * 
 * 返回 HTTP 200，通过业务码区分错误
 * 
 * 适用场景：
 * - 可预期的业务错误（用户名已存在、数据不存在等）
 * - 需要前端友好提示的错误
 * 
 * 不适用场景：
 * - 认证错误（应使用 UnauthorizedException，HTTP 401）
 * - 权限错误（应使用 ForbiddenException，HTTP 403）
 * - 服务器错误（应使用 InternalServerErrorException，HTTP 500）
 */
export class BusinessException extends HttpException {
  constructor(code: ResponseCode, message?: string) {
    const msg = message || RESPONSE_MESSAGE[code] || '业务错误';
    
    super(
      {
        code,
        message: msg,
      },
      HttpStatus.OK  // HTTP 状态码固定为 200
    );
  }
}

/**
 * 业务异常工厂类
 * 提供语义化的异常抛出方法
 * 
 * @example
 * // 使用工厂方法（推荐）
 * throw BizException.userExist();
 * throw BizException.userExist('自定义消息');
 * 
 * // 或直接使用 BusinessException
 * throw new BusinessException(RESPONSE_CODE.USER_EXIST);
 */
export class BizException {
  // === 用户相关（1000-1099）===
  
  /** 用户名已存在 */
  static userExist(message?: string) {
    return new BusinessException(RESPONSE_CODE.USER_EXIST, message);
  }
  
  /** 用户不存在 */
  static userNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.USER_NOT_FOUND, message);
  }
  
  /** 密码错误 */
  static invalidPassword(message?: string) {
    return new BusinessException(RESPONSE_CODE.INVALID_PASSWORD, message);
  }
  
  /** 账号已被禁用 */
  static userDisabled(message?: string) {
    return new BusinessException(RESPONSE_CODE.USER_DISABLED, message);
  }
  
  // === 角色相关（1100-1199）===
  
  /** 角色代码已存在 */
  static roleExist(message?: string) {
    return new BusinessException(RESPONSE_CODE.ROLE_EXIST, message);
  }
  
  /** 角色不存在 */
  static roleNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.ROLE_NOT_FOUND, message);
  }
  
  /** 角色正在使用中 */
  static roleInUse(message?: string) {
    return new BusinessException(RESPONSE_CODE.ROLE_IN_USE, message);
  }
  
  /** 角色已禁用 */
  static roleDisabled(message?: string) {
    return new BusinessException(RESPONSE_CODE.ROLE_DISABLED, message);
  }
  
  // === 菜单相关（1200-1299）===
  
  /** 菜单权限标识已存在 */
  static menuExist(message?: string) {
    return new BusinessException(RESPONSE_CODE.MENU_EXIST, message);
  }
  
  /** 菜单不存在 */
  static menuNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.MENU_NOT_FOUND, message);
  }
  
  /** 菜单下存在子菜单 */
  static menuHasChildren(message?: string) {
    return new BusinessException(RESPONSE_CODE.MENU_HAS_CHILDREN, message);
  }
  
  /** 菜单已被角色使用 */
  static menuInUse(message?: string) {
    return new BusinessException(RESPONSE_CODE.MENU_IN_USE, message);
  }
  
  // === 部门相关（1400-1499）===
  
  /** 部门代码已存在 */
  static deptExist(message?: string) {
    return new BusinessException(RESPONSE_CODE.DEPT_EXIST, message);
  }
  
  /** 部门不存在 */
  static deptNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.DEPT_NOT_FOUND, message);
  }
  
  /** 部门下存在子部门 */
  static deptHasChildren(message?: string) {
    return new BusinessException(RESPONSE_CODE.DEPT_HAS_CHILDREN, message);
  }
  
  /** 部门下存在用户 */
  static deptHasUsers(message?: string) {
    return new BusinessException(RESPONSE_CODE.DEPT_HAS_USERS, message);
  }
  
  // === 岗位相关（1500-1599）===
  
  /** 岗位代码已存在 */
  static postExist(message?: string) {
    return new BusinessException(RESPONSE_CODE.POST_EXIST, message);
  }
  
  /** 岗位不存在 */
  static postNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.POST_NOT_FOUND, message);
  }
  
  /** 岗位正在使用中 */
  static postInUse(message?: string) {
    return new BusinessException(RESPONSE_CODE.POST_IN_USE, message);
  }
  
  // === 字典相关（1600-1699）===
  
  /** 字典代码已存在 */
  static dictExist(message?: string) {
    return new BusinessException(RESPONSE_CODE.DICT_EXIST, message);
  }
  
  /** 字典不存在 */
  static dictNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.DICT_NOT_FOUND, message);
  }
  
  /** 字典正在使用中 */
  static dictInUse(message?: string) {
    return new BusinessException(RESPONSE_CODE.DICT_IN_USE, message);
  }
  
  /** 字典数据已存在 */
  static dictDataExist(message?: string) {
    return new BusinessException(RESPONSE_CODE.DICT_DATA_EXIST, message);
  }
  
  /** 字典数据不存在 */
  static dictDataNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.DICT_DATA_NOT_FOUND, message);
  }
  
  // === 通用错误 ===
  
  /** 参数错误 */
  static invalidParams(message?: string) {
    return new BusinessException(RESPONSE_CODE.INVALID_PARAMS, message);
  }
  
  /** 必填字段缺失 */
  static requiredField(message?: string) {
    return new BusinessException(RESPONSE_CODE.REQUIRED_FIELD, message);
  }
  
  /** 格式错误 */
  static invalidFormat(message?: string) {
    return new BusinessException(RESPONSE_CODE.INVALID_FORMAT, message);
  }
  
  /** 操作失败 */
  static operationFailed(message?: string) {
    return new BusinessException(RESPONSE_CODE.OPERATION_FAILED, message);
  }
  
  /** 数据不存在 */
  static dataNotFound(message?: string) {
    return new BusinessException(RESPONSE_CODE.DATA_NOT_FOUND, message);
  }
  
  /** 数据已存在 */
  static dataAlreadyExists(message?: string) {
    return new BusinessException(RESPONSE_CODE.DATA_ALREADY_EXISTS, message);
  }
  
  /** 数据正在使用中 */
  static dataInUse(message?: string) {
    return new BusinessException(RESPONSE_CODE.DATA_IN_USE, message);
  }
  
  /** 文件过大 */
  static fileTooLarge(message?: string) {
    return new BusinessException(RESPONSE_CODE.FILE_TOO_LARGE, message);
  }
  
  /** 文件类型不允许 */
  static fileTypeNotAllowed(message?: string) {
    return new BusinessException(RESPONSE_CODE.FILE_TYPE_NOT_ALLOWED, message);
  }
}

